package com.bytz.modules.cms.order.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.bytz.modules.cms.domain.model.pay.BalancePayIn;
import com.bytz.modules.cms.domain.model.pay.PayOut;
import com.bytz.modules.cms.domain.model.pay.PrepayIn;
import com.bytz.modules.cms.order.entity.Order;
import com.bytz.modules.cms.order.entity.OrderItem;
import com.bytz.modules.cms.order.entity.OrderPay;
import com.bytz.modules.cms.order.entity.OrderPayDetail;
import com.bytz.modules.cms.order.model.PayNotifyResult;

import java.math.BigDecimal;
import java.util.List;

/**
 * <p>
 * 莱宝CMS—订单管理-订单交易记录表 服务类
 * </p>
 *
 * @author KyleWang
 * @since 2022-10-10
 */
public interface IOrderPayService extends IService<OrderPay> {

    /**
     * 获取订单付款信息
     */
    List<OrderPay> getByOrderId(String orderId);

    /**
     * 支付首付
     * @param prepay 首付模型
     */
    PayOut prepay(PrepayIn prepay);

    /**
     * 支付结果通知
     * @param payNotifyResult 支付结果
     */
    void notify(PayNotifyResult payNotifyResult);

    /**
     * 有支付中记录
     */
    boolean hasPayingRecord(String orderId);

    /**
     * 支付提交
     * @param orderPayId 支付Id
     */
    void submitPay(String orderPayId);

    /**
     * 支付作废
     * @param orderPayId 支付Id
     */
    void rollbackPay(String orderPayId);

    /**
     * 尾款数据准备
     */
    PayOut balancePay(BalancePayIn balance);

    /**
     * 计算首付金额（给前端使用）
     */
    BigDecimal calculatePrepayPrice(Order order, List<OrderItem> orderItems);

    /**
     * 将提货明细、pay主数据、pay明细数据状态更新成交易失败
     * 将线下支付记录更新失败，并释放汇票
     * 此方法可以直接使用回调的方法
     * @param orderPayDetail 订单交易支付明细
     */
    void rollbackPay(OrderPayDetail orderPayDetail);
}
